package com.xinqi.modules.chat.chat.group.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.user.Account;
import com.xinqi.common.mybatis.data.service.BaseService;
import com.xinqi.modules.chat.chat.group.domain.ChatGroupEntity;
import com.xinqi.modules.chat.chat.group.domain.ChatGroupUserEntity;
import com.xinqi.modules.chat.chat.group.dto.req.*;
import com.xinqi.modules.chat.chat.group.dto.rsp.ChatGroupUserAdminResultDTO;
import com.xinqi.modules.chat.chat.group.dto.rsp.ChatGroupUserResultDTO;

import java.util.List;

/**
 * 群组成员表服务层
 *
 * @author: system
 * @date: 2023/01/12
 */
public interface ChatGroupUserService extends BaseService<ChatGroupUserEntity> {

    /**
     * 根据群组ID删除群成员
     *
     * @param groupId
     * @return
     */
    Boolean deleteByGroupId(String groupId);

    /**
     * 设置群-成员
     *
     * @param userId
     * @param dto    ChatGroupUserUpdateDTO
     * @return Boolean
     */
    Boolean setGroupUser(Long userId, ChatGroupUserUpdateDTO dto);

    /**
     * 添加邀请群成员
     *
     * @param groupId 群组Id（融云）
     * @param dto     AddUserGroupCreateDTO
     * @return Boolean
     */
    Boolean addGroupUser(Account user, String groupId, AddUserGroupCreateDTO dto);

    /**
     * 添加群成员
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean addAdmin(Account user, AddUserGroupCreateAdminDTO dto);

    /**
     * 用户主动加入
     *
     * @param groupId
     * @param user
     * @return
     */
    Boolean joinGroupUser(String groupId, Account user);

    /**
     * 加入班级群
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classJoinGroup(Long classId, Long userId);

    /**
     * 移除群成员
     *
     * @param user
     * @param groupId 群组Id（融云）
     * @param dto     AddUserGroupCreateDTO
     * @return Boolean
     */
    Boolean removeGroupUser(Account user, String groupId, RemoveUserGroupDTO dto);

    /**
     * 移除群成员
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean removeAdmin(Account user, RemoveUserGroupAdminDTO dto);

    /**
     * 添加管理员
     *
     * @param dto AddGroupManageDTO
     * @return Boolean
     */
    Boolean addGroupManage(Account user, AddGroupManageDTO dto);

    /**
     * 获取群管理员列表
     *
     * @param groupId 群id(融云)
     * @return ChatGroupUserResultDTO
     */
    List<ChatGroupUserResultDTO> findGroupManage(String groupId);

    /**
     * 移除群管理员
     *
     * @param dto AddGroupManageDTO
     * @return Boolean
     */
    Boolean removeGroupManage(Account user, AddGroupManageDTO dto);

    /**
     * 获取群审核列表
     *
     * @param userId
     * @param groupId 群Id(融云)
     * @return ChatGroupUserResultDTO
     */
    List<ChatGroupUserResultDTO> getGroupManageAutoList(Long userId, String groupId);

    /**
     * 获取群成员列表
     *
     * @param dto
     * @return ChatGroupUserResultDTO
     */
    List<ChatGroupUserResultDTO> getUserList(ChatGroupUserQueryDTO dto);

    /**
     * 获取群成员列表 -- 分页
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<ChatGroupUserResultDTO> getUserPage(Param pageable, ChatGroupUserQueryDTO query);

    /**
     * 获取群成员列表 -- 分页
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<ChatGroupUserAdminResultDTO> pageAdmin(Param pageable, ChatGroupUserAdminQueryDTO query);

    /**
     * 退群
     *
     * @param userId
     * @param groupId 群Id(融云)
     * @return Boolean
     */
    Boolean exitGroup(Long userId, String groupId);

    /**
     * 退出班级群
     *
     * @param classId 班级ID
     * @param userId  退出群用户ID
     * @return
     */
    Boolean classExitGroup(Long classId, Long userId);

    /**
     * 添加消息免打扰关注成员
     *
     * @param userId
     * @param groupId 群Id(融云)
     * @param dto     AddUserGroupCreateDTO
     * @return Boolean
     */
    Boolean addGroupFollow(Long userId, String groupId, AddUserGroupCreateDTO dto);

    /**
     * 查询消息免打扰关注成员
     *
     * @param userId
     * @param groupId groupId
     * @return ChatGroupUserResultDTO
     */
    List<ChatGroupUserResultDTO> getGroupFollow(Long userId, String groupId);

    /**
     * 根据群组ID获取群成员信息
     *
     * @param groupId
     * @param operationUserId
     * @return
     */
    List<ChatGroupUserResultDTO> findGroupId(String groupId, Long operationUserId);

    /**
     * 根据群成员用户ID获取群成员信息
     *
     * @param userList
     * @param type
     * @return
     */
    List<ChatGroupUserResultDTO> findReadUserList(List<Long> userList, int type);

    /**
     * 审核通过
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean examineUserToGroup(Account user, ChatGroupUsersExamineDTO dto);

    /**
     * 审核通过 -- 批量
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean examineUserToGroup(Account user, ChatGroupUsersBatchExamineDTO dto);

    /**
     * 审核拒绝
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean refuseUserToGroup(Account user, ChatGroupUsersExamineDTO dto);

    /**
     * 审核拒绝 -- 批量
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean refuseUserToGroup(Account user, ChatGroupUsersBatchExamineDTO dto);

    /**
     * 通过用户ID和群组ID获取用户
     *
     * @param userId
     * @param groupId 群Id(融云)
     * @return ChatGroupUserResultDTO
     */
    ChatGroupUserResultDTO selectByUserIdAndGroupId(Long userId, String groupId);

    /**
     * 校验群管理员权限
     *
     * @param userId
     * @param groupId
     */
    ChatGroupUserEntity checkAdministration(Long userId, String groupId);

    /**
     * 获取群成员信息 -- 根据加群时间排序
     *
     * @param groupId
     * @param status
     * @param limit
     * @return
     */
    List<ChatGroupUserResultDTO> getGroupUserOrderByCreateTime(String groupId, Integer status, Integer limit);

    /**
     * 退出群聊
     *
     * @param group
     * @param leader
     * @return
     */
    boolean leaderExitGroup(ChatGroupEntity group, ChatGroupUserResultDTO leader);

    /**
     * 设为群主
     *
     * @param user
     * @param dto
     * @return
     */
    Boolean setLeaderAdmin(Account user, SetUserGroupAdminDTO dto);
}
